﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Программа работает в цикле в течении 10 раз");
            
            Console.WriteLine("Введите размер массива: ");
            int size = Convert.ToInt32(Console.ReadLine());
            int[] a = new int[size];

            TimeSpan aberage = new TimeSpan();//создаем объект timespan вне цикла и инициализируем нулем

            Console.WriteLine("Для случайного заполнения массива введите \"1\", для самостоятельного любую другую цифру");
            int select = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Для сортировки выбором введите \"1\", для сортировки Шелла введите любое другое число.");
            int select_sort = Convert.ToInt32(Console.ReadLine());

            for (int n = 0; n < 10; n++)
            {
                if (select == 1)
                {
                    Random rand = new Random();
                    for (int i = 0; i < a.Length; i++)
                        a[i] = rand.Next();
                }
                else
                {
                    for (int i = 0; i < a.Length; i++)
                        a[i] = Convert.ToInt32(Console.ReadLine());
                }


                
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();

                if (select_sort == 1)
                {
                    int step = size / 2;//инициализируем шаг.    
                    while (step > 0)//пока шаг не 0    
                    {
                        for (int i = 0; i < (size - step); i++)
                        {
                            int j = i;//будем идти начиная с i-го элемента                    
                            while (j >= 0 && a[j] > a[j + step])
                            //пока не пришли к началу массива                    
                            //и пока рассматриваемый элемент больше                    
                            //чем элемент находящийся на расстоянии шага                    
                            {
                                //меняем их местами                        
                                int temp = a[j];
                                a[j] = a[j + step];
                                a[j + step] = temp;
                                j--;
                            }
                        }
                        step = step / 2;//уменьшаем шаг            
                    }
                }
                else
                {
                    for (int i = 0; i < a.Length; i++)
                    {
                        int min = i; /* min – позиция минимального элемента */
                        /* внутренний цикл. если найден элемент строго меньший текущего минимального, записываем его индекс как минимальный */
                        for (int j = i + 1; j < a.Length; j++)
                        {
                            if (a[j] < a[min]) min = j;
                        }
                        if (min != i) /* минимальный элемент не является первым неотсортированным, обмен нужен */
                        {
                            int temp = a[i];
                            a[i] = a[min];
                            a[min] = temp;
                        }
                    }
                }

                stopWatch.Stop();

                TimeSpan ts = stopWatch.Elapsed;
               

                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);
                Console.WriteLine("RunTime " + elapsedTime);

                aberage += stopWatch.Elapsed;/*TimeSpan.FromSeconds(0);*/

            }
            string fullTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    aberage.Hours, aberage.Minutes, aberage.Seconds,
                    aberage.Milliseconds / 10);
            Console.WriteLine("Общее время выполения десяти итераций сортировки: " + fullTime);
            Console.WriteLine("То же в миллисекундах: " + Convert.ToString(aberage.TotalMilliseconds));

            //fullTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            //        aberage.Hours/10, aberage.Minutes/10, aberage.Seconds/10,
            //        aberage.Milliseconds / 100);
            //Console.WriteLine("Среднее время выполения десяти итераций сортировки: " + fullTime);
            
            Console.WriteLine("Среднее время выполения десяти итераций сортировки в миллисекундах: " + Convert.ToString(aberage.TotalMilliseconds / 10));
            Console.ReadKey();
        }
    }

}